
#include "adc.h"
#include "main.h"



u16 ad_result[3] __attribute__((aligned(4))) = {0}; // 注意需要u16数组且需要4字节对齐，根据选择的通道决定数组个数
void adc_init(void)
{
    TYPE_LL_GPIO_INIT gpio_struct;
    memset(&gpio_struct, 0x00, sizeof(gpio_struct));
    gpio_struct.gpio_pin = MOTOR_CURRENT_SAMPL_GPIO_PIN | INFRARED_SAMPL_GPIO_PIN | BATT_SAMPL_GPIO_PIN;
    gpio_struct.gpio_mode = LL_GPIO_MODE_AN; // 模拟模式
    ll_gpio_init(SAMPL_GPIO_X, &gpio_struct);

    TYPE_LL_ADC_INIT adc_cfg;
    memset(&adc_cfg, 0x00, sizeof(adc_cfg));
    adc_cfg.ref_voltage = LL_ADC_VSEL_AVCC;                                        // 选择参考电压
    adc_cfg.prescaler = 0xF;                                                       // ADC预分频器值
    adc_cfg.channel_map = MOTOR_CURRENT_ADC_CHS | INFRARED_ADC_CHS | BATT_ADC_CHS; // 选择ADC通道
    adc_cfg.dma_len = 3;
    adc_cfg.dma_addr = (u32)ad_result;
    adc_cfg.interval_period = 1;
    adc_cfg.data_align = LL_ADC_DATA_RIGHT_ALIGN; // 数据右对齐
    ll_adc_init(ADC, &adc_cfg);
   // delay_us(100);
}
void adc_start_sampl(void)
{
    ll_adc_start_enable(); // ADC开始转化
    while (!(LL_ADC_DONE_PEND_GET()))
        ;                   // 等待转化完成
    LL_ADC_DONE_PEND_CLR(); // 清除标志
    // printf("ad [0] %u ",ad_result[0]);
    // printf("ad [1] %u ",ad_result[1]);
    // printf("ad [2] %u ",ad_result[2]);
}
/*
返回电池电压  单位mv
*/
uint16_t get_batt_voltage(void)
{
    uint16_t voltage;
    voltage = ad_result[2] * 3300 / 4095 *2;
//    printf("batt  %u ", voltage);
    return voltage;
}
/*
返回电机电流  单位ma  运放  放大 52倍
*/
uint16_t get_motor_current(void)
{
    uint16_t current;
    current = ad_result[0] * 3300 / 4095 *51;
//     printf("current  %u ", current);
    return current;
}
/*
返回传感器 ad值
*/
uint16_t get_sensor_ad(void)
{
    return ad_result[1];
}
